# -*- coding: utf-8 -*-
# Gestión de licencias de proyecto y módulos.

## vipera, un diseñador de aplicaciones para Python
##     Copyright (C) 2011 Ángel Luis García García
##
##    This program is free software: you can redistribute it and/or modify
##    it under the terms of the GNU General Public License as published by
##    the Free Software Foundation, either version 3 of the License, or
##    (at your option) any later version.
##
##    This program is distributed in the hope that it will be useful,
##    but WITHOUT ANY WARRANTY; without even the implied warranty of
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##    GNU General Public License for more details.
##
##    You should have received a copy of the GNU General Public License
##    along with this program.  If not, see <http://www.gnu.org/licenses/>.

import wx
import wx.lib.dialogs

import os
import codecs

from configuracion_vipera import proy_por_defecto as por_defecto
from i18n_vipera import t

# Título de la licencia.
lic_titul = {"GPL" : "GNU General Public License",
             "MIT" : "MIT license",
             "BSD-3-Clause" : 'BSD 3-Clause "New" or "Revised" license',
             "BSD-2-Clause" : 'BSD 2-Clause "Simplified" or "FreeBSD" license',
             "Apache-2.0" : "Apache License, 2.0"}

# La licencia se generará en la cabecera de cada módulo.
lic_modul = {"GPL" : True,
             "MIT" : False,
             "BSD-3-Clause" : False,
             "BSD-2-Clause" : False,
             "Apache-2.0" : False}

# Ficheros de licencias.
lice_fich = {"GPL" : ['gpl_template.vipera','gpl_info.vipera'],
             "MIT" : ['mit_template.vipera', 'mit_info.vipera'],
             "BSD-3-Clause" : ['bsd3_template.vipera', 'bsd3_info.vipera'],
             "BSD-2-Clause" : ['bsd2_template.vipera', 'bsd2_info.vipera'],
             "Apache-2.0" : ['apache_template.vipera', 'apache_info.vipera']}

# Parámetros de licencias: [Propietario, año, organización, descripción]
lic_param = {"GPL" : [True, True, False, True],
             "MIT" : [True, True, False, False],
             "BSD-3-Clause" : [True , True, True, False],
             "BSD-2-Clause" : [True , True, False, False],
             "Apache-2.0" : [True, True, False, False]}

def f_param_lic(texto, licencia, propietario, anyo, organizacion, descripcion):
    '''Función para parametrizar una licencia.'''
    if licencia == "GPL": ret = texto % (descripcion, anyo, propietario)
    if licencia == "MIT": ret = texto % (anyo, propietario)
    if licencia == "BSD-3-Clause": ret = texto % (anyo, propietario, organizacion)
    if licencia == "BSD-2-Clause": ret = texto % (anyo, propietario) 
    if licencia == "Apache-2.0": ret = texto % (anyo, propietario)
    # Devolvemos el texto formateado.
    return ret

def f_mostrar_info(texto, titulo):
    '''Función para mostrar información sobre licencia.'''
    dlg = wx.lib.dialogs.ScrolledMessageDialog(None, texto, titulo)
    dlg.ShowModal()
    dlg.Destroy()

def f_abrir_ficheros_lic(licencia, idioma = None):
    '''Función para abrir ficheros de licencias.'''
    # Obtenemos plantilla desde fichero.
    plantilla = lice_fich[licencia][0]
    info = lice_fich[licencia][1]
    carpeta = por_defecto['fich_licencias']
    ruta_plantilla = '%s%s%s' % (carpeta, por_defecto['sep'], plantilla)
    ruta_info = '%s%s%s' % (carpeta, por_defecto['sep'], info)
    # Intentamos abrir los ficheros...
    try:
        f = codecs.open(ruta_plantilla, 'r', 'utf-8')
        datos_plantilla = f.read()
        f.close()
    except:
        msj = t(u"No se pudo abrir el fichero ", idioma) + ruta_plantilla
        wx.MessageBox(msj, t(u"Atención", idioma), wx.OK)
        return None
    try:
        f = codecs.open(ruta_info, 'r', 'utf-8')
        datos_info = f.read()
        f.close()
    except:
        msj = t(u"No se pudo abrir el fichero ", idioma) + ruta_info
        wx.MessageBox(msj, t(u"Atención", idioma), wx.OK)
        return None
    # Devolvemos tupla.
    return datos_plantilla, datos_info

class dialogo_licencias(wx.Dialog):
    '''Diálogo para parametrizar licencias'''
    def __init__(self, parent, parametros, idioma = None):
        '''Constructor de clase'''
        wx.Dialog.__init__(self, parent, -1, title = t(u"Configurar licencia", idioma), 
                           size = wx.Size( 390,266 ), 
                           style = wx.DEFAULT_DIALOG_STYLE )
        # parámetros: [Propietario, año, organización, descripción]
        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
        bSizer1 = wx.BoxSizer( wx.VERTICAL )
        fgSizer1 = wx.FlexGridSizer(3, 2, 0, 0)
        fgSizer1.AddGrowableCol(1)
        fgSizer1.AddGrowableRow(0)
        fgSizer1.AddGrowableRow(1)
        fgSizer1.AddGrowableRow(2)
        fgSizer1.AddGrowableRow(3)
        fgSizer1.AddGrowableRow(4)
        fgSizer1.AddGrowableRow(5)
        fgSizer1.SetFlexibleDirection(wx.BOTH)
        fgSizer1.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
        # Propietario
        self.m_staticText6 = wx.StaticText( self, -1, t(u"Propietario", idioma))
        self.m_staticText6.Wrap(-1)
        fgSizer1.Add(self.m_staticText6, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
        self.m_textCtrl_propietario = wx.TextCtrl(self, -1)
        fgSizer1.Add(self.m_textCtrl_propietario, 0, wx.ALL|wx.EXPAND, 5)
        if not parametros[0]: self.m_textCtrl_propietario.Enable(False)        
        # Año.
        self.m_staticText7 = wx.StaticText(self, -1, t(u"Año", idioma))
        self.m_staticText7.Wrap(-1)
        fgSizer1.Add(self.m_staticText7, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
        self.m_textCtrl_anyo = wx.TextCtrl(self, -1)
        fgSizer1.Add(self.m_textCtrl_anyo, 0, wx.ALL|wx.EXPAND, 5)
        if not parametros[1]: self.m_textCtrl_anyo.Enable(False)
        # Organización.
        self.m_staticText8 = wx.StaticText(self, -1, t(u"Organización", idioma))
        self.m_staticText8.Wrap(-1)
        fgSizer1.Add(self.m_staticText8, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
        self.m_textCtrl_organizacion = wx.TextCtrl(self, -1)
        fgSizer1.Add(self.m_textCtrl_organizacion, 0, wx.ALL|wx.EXPAND, 5)
        if not parametros[2]: self.m_textCtrl_organizacion.Enable(False)
        # Añadimos el flexgridsizer al sizer padre.
        bSizer1.Add(fgSizer1, 0, wx.ALL|wx.EXPAND, 10)
        # Nombre de programa y descripción.
        self.m_staticText9 = wx.StaticText( self, -1, t(u"Nombre del programa y una breve idea de lo que hace", idioma))
        self.m_staticText9.Wrap(-1)
        bSizer1.Add(self.m_staticText9, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 10)
        self.m_textCtrl_descripcion = wx.TextCtrl(self, -1)
        bSizer1.Add(self.m_textCtrl_descripcion, 0, wx.ALL|wx.EXPAND, 10)
        if not parametros[3]: self.m_textCtrl_descripcion.Enable(False)
        # Creamos botones de Aceptar/Cancelar.
        m_sdbSizer1 = wx.StdDialogButtonSizer()
        self.m_sdbSizer1OK = wx.Button( self, wx.ID_OK )
        m_sdbSizer1.AddButton( self.m_sdbSizer1OK )
        self.m_sdbSizer1Cancel = wx.Button( self, wx.ID_CANCEL )
        m_sdbSizer1.AddButton( self.m_sdbSizer1Cancel )
        m_sdbSizer1.Realize()
        bSizer1.Add( m_sdbSizer1, 0, wx.ALL|wx.EXPAND, 10 )
        # Añadimos el sizer padre al contenedor.
        self.SetSizer( bSizer1 )
        self.Layout()
        # Centramos el diálogo.
        self.Centre( wx.BOTH )
